use Test::More;
use Batch::Cluster;
use List::Util qw{ sum };

BEGIN
{
	if( defined $ENV{DEVELOPER} ) 
	{
		plan tests => 1+1+3+3+2+3+1+1+1;
	}
	else 
	{
		plan skip_all => 'Tests para el desarrollador';
	}
};
 
{ 
	use_ok('Batch::Cluster') 
}
	

my @remote_hosts = qw{binot banot benot};

# Comprobamos que el contructor muera al recibir un array de máquinas vacío
{
	eval
	{
		my $batch = Batch::Cluster->new([]);
	};
	
	ok($@, "Probando el constructor vacío");
}

# Tests para el constructor
{
	my $batch = Batch::Cluster->new(\@remote_hosts);
	my @machines = $batch->all_machines();
	ok(@machines == 3, 'Constructor crea el tantas conexiones como parámetros recibe');
	
	for(0..2)
	{
		is($machines[$_]->host(), $remote_hosts[$_], 'Probando la conexión con el host '.$machines[$_]->host());
	}
}

# Tests para el copyandmake
{
	my $batch = Batch::Cluster->new(\@remote_hosts);
		
	$batch->copyandmake
	(
		dir => 'pi',
		files => [ qw{t/pi.c t/Makefile} ],
		makeargs => 'pi',
		cleanfiles => 1,
		cleandirs => 1,	
	);
	
	my @machines = $batch->all_machines();
	for(@machines)
	{
		ok($_->_x('pi')->result(), "Probando que 'pi' se puede ejecutar en el host ".$_->host())
	}
	
}

# Tests para el changedir
{
	my $batch = Batch::Cluster->new(\@remote_hosts);
	
	# Hacemos el copyandmake con keepdir = 1, de forma que no se quedará en ese directorio
	$batch->copyandmake
	(
		dir => 'pi_temp',
		files => [ qw{t/pi.c t/Makefile} ],
		makeargs => 'pi',
		cleanfiles => 1,
		cleandirs => 1,
		keepdir => 1,
	);
	
	my $ok = $batch->chdir('pi_temp'); 
	ok($ok, "Probando el método chdir en un directorio que existe ");
	
	my $notok = $batch->chdir('/un/directorio/que/no/deberia/exisitir');
	ok(!$notok, "Probando el método chdir en un directorio que no existe ");
}

# Tests para el run
{
	my $batch = Batch::Cluster->new(\@remote_hosts);
	
	my @commands = ('echo 1', 'echo 2');
	ok(sum ($batch->run(@commands)) == 1+2, "Probando el método run: menos comandos que máquinas");
	
	@commands = ('echo 1', 'echo 2', 'echo 3');
	ok(sum ($batch->run(@commands)) == 1+2+3, "Probando el método run: igual número de comandos que máquinas");
	
	@commands = map {  "echo $_" } 1..200;
	ok(sum ($batch->run(@commands)) == sum (1..200), "Probando el método run: más comandos que máquinas");
	
	@commands = map {  "echo $_" } 1..200;
	is_deeply([$batch->run(@commands)], [1..200], "Probando orden de los resultados obtenidos");
}

# Tests con el ejemplo de pi, lo contiene todo
{
	my $np = 20;    
	my $N = 1000;   
	my $clean = 1;  
	my $c = Batch::Cluster->new(\@remote_hosts) || die "Error Intializing Cluster";
	# Transference of files to remote hosts
	$c->copyandmake
	(
		dir => 'pi',
		makeargs => 'pi',
		files => [ qw{t/pi.c t/Makefile} ],
		cleanfiles => $clean,
		cleandirs => $clean, # remove the whole directory at the end
		keepdir => 1,
	);
	
	
	$c->chdir("pi/")  || die "Can't change to pi/\n";
	
	my @commands = map {  "./pi $_ $N $np" } 0..$np-1;
	
	my $pi = sum $c->run(@commands);
	
	ok(($pi > 3.1) && ($pi < 3.2), "Probando el resultado de pi");
}